import 'dart:async';
import 'package:intl/intl.dart';
import 'package:timezone/data/latest.dart' as tz;
import 'package:timezone/timezone.dart' as tz;

void main() async {
  // 初始化时区数据
  tz.initializeTimeZones();

  // 定义各时区的位置
  final chinaLocation = tz.getLocation('Asia/Shanghai'); // 中国时区（UTC+8）
  final usaLocation = tz.getLocation('America/New_York'); // 美国纽约时区
  final africaLocation = tz.getLocation('Africa/Cairo'); // 埃及开罗时区（UTC+2）
  final ukLocation = tz.getLocation('Europe/London'); // 英国伦敦时区

  // 获取当前 UTC 时间
  final utcNow = DateTime.now().toUtc();

  // 计算 UTC 时间的 3 天后
  final utcThreeDaysLater = utcNow.add(const Duration(days: 3));

  // 输出各时区的当前时间和 3 天后的时间（基于 UTC 计算）
  print('===== 基于 UTC 的时间计算 =====');
  _printTimeZoneInfo(
    '中国 (Asia/Shanghai)',
    chinaLocation,
    utcNow,
    utcThreeDaysLater,
  );
  _printTimeZoneInfo(
    '美国 (America/New_York)',
    usaLocation,
    utcNow,
    utcThreeDaysLater,
  );
  _printTimeZoneInfo(
    '埃及 (Africa/Cairo)',
    africaLocation,
    utcNow,
    utcThreeDaysLater,
  );
  _printTimeZoneInfo(
    '英国 (Europe/London)',
    ukLocation,
    utcNow,
    utcThreeDaysLater,
  );
  _printTimeZoneInfo('UTC', null, utcNow, utcThreeDaysLater);
}

void _printTimeZoneInfo(
  String label,
  tz.Location? location,
  DateTime now,
  DateTime later,
) {
  final nowFormatted = _formatDateTimeWithTimeZone(now, location);
  final laterFormatted = _formatDateTimeWithTimeZone(later, location);
  print('$label 时间:');
  print('  当前时间: $nowFormatted');
  print('  3 天后时间: $laterFormatted');
  print('-----------------------');
}

String _formatDateTimeWithTimeZone(DateTime dateTime, tz.Location? location) {
  if (location == null) {
    // 直接格式化 UTC 时间
    return DateFormat('yyyy-MM-dd HH:mm:ss \'UTC\'').format(dateTime);
  } else {
    // 将 UTC 时间转换为指定时区的时间
    final tzDateTime = tz.TZDateTime.from(dateTime, location);
    return DateFormat('yyyy-MM-dd HH:mm:ss z').format(tzDateTime);
  }
}
